package Day_0224.NetWork;

/**
 * @author zxc
 * @date 2023/02/24 17:57
 **/
public class TCP_SlidingWindow {
    public static void main(String[] args) {
        /**
         * TCP滑动窗口机制
         * ===》
         * 1.窗口是缓存的一部分，用来暂时存放字节流。
         * （1）发送方和接收方各有一个窗口，接收方通过 TCP 报文段中的窗口字段，告诉发送方自己的窗口大小，
         *  发送方根据这个值和其它信息设置自己的窗口大小。
         * （2）发送窗口内的字节都允许被发送，接收窗口内的字节都允许被接收。
         * （3）如果发送窗口左部的字节已经发送并且收到了确认，那么就将发送窗口向右滑动一定距离，直到左部第一个字节不是已发送并且已确认的状态；
         * （4）接收窗口的滑动类似，接收窗口左部字节已经发送确认并交付主机，就向右滑动接收窗口。
         * （5）接收窗口只会对窗口内最后一个按序到达的字节进行确认，
         *  例如接收窗口已经收到的字节为 {31, 34,35}，其中 {31} 按序到达，而 {34, 35} 就不是，因此只对字节 31 进行确认。
         *  ===》
         *  发送方得到一个字节的确认之后，就知道这个字节之前的所有字节都已经被接收。
         *
         *  ===》
         *  总结 ：
         *  发送窗口会根据接收窗口 && 阻塞窗口，来决定发送窗口的大小;
         *
         *  2.说说TCP 流量控制
         *  ===》
         * （1）流量控制是为了控制发送方发送速率，保证接收方来得及接收。
         * （2）接收方发送的确认报文中的窗口字段，可以用来控制发送方窗口大小，从而影响发送方的发送速率。
         *  将窗口字段设置为 0，则发送方不能发送数据。
         * ===》
         * 实际上，为了避免此问题的产生，发送端主机会时不时的发送一个叫做窗口探测的数据段，
         * 此数据段仅包含一个字节来获取最新的窗口大小信息。
         *
         * ===》
         * 总结 ：
         * 即，发送窗口会根据接收方所能接收数据的大小（接收窗口大小），来控制数据发送的速率（调整发送窗口的大小）;
         *
         */
    }
}
